// 配置路由的地方
import Vue from 'vue'
import VueRouter from 'vue-router'
import routes from './routes.js'

// 引入store
import store from '@/store/store'

// 使用插件
Vue.use(VueRouter)

// 先把VueRouter原型对象的push,先保存一份
let originPush = VueRouter.prototype.push
let originReplace = VueRouter.prototype.replace

// 重写push|replace
// 第一个参数：告诉原来push方法，你往哪里跳转（传递哪些参数）
// 第二个参数：成功回调
// 第三个参数：失败回调
VueRouter.prototype.push = function (location, resolve, reject) {
  if (resolve && reject) {
    // call|apply区别：
    // 相同点，都可以调用函数一次，都可以篡改函数的上下文一次
    // 不同点：call与apply传递参数：call传递参数用逗号隔开，apply方法执行，传递数组
    originPush.call(this, location, resolve, reject)
  } else {
    originPush.call(
      this,
      location,
      () => {},
      () => {}
    )
  }
}
VueRouter.prototype.replace = function (location, resolve, reject) {
  if (resolve && reject) {
    originReplace.call(location, resolve, reject)
  } else {
    originReplace.call(
      location,
      () => {},
      () => {}
    )
  }
}

// 配置路由
let router = new VueRouter({
  mode: 'history',
  // 配置路由
  routes,
  // 滚动行为
  scrollBehavior(to, from, savedPosition) {
    // return 期望滚动到哪个的位置
    // 返回的这个y=0,代表滚动条在最上方
    return { y: 0 }
  },
})

// 全局守卫：前置守卫（在路由跳转之间进行判断）
router.beforeEach(async (to, from, next) => {
  // to:可以获取到你要跳转到那个路由信息
  // from:可以获取到你从哪个路由而来的信息
  // next:放行函数  next() 放行  next(path) 放行到指定的路由  next(false)

  // 用户登录了，才有token,未登录一定不会有token
  let token = store.state.user.token
  // 用户的信息
  let name = store.state.user.userInfo.name
  // 用户登录了
  if (token) {
    // 不能去login,停留在首页
    if (to.path == '/login' || to.path == '/register') {
      next('/home')
    } else {
      // 登录了，但是不去login与register页面
      if (name) {
        // 有用户名
        next()
      } else {
        // 没有用户名，派发action让仓库存储用户信息再跳转
        try {
          // 获取用户信息成功
          await store.dispatch('getUserInfo')
          // 放行
          next()
        } catch (error) {
          // token失效了
          // 清除token
          await store.dispatch('userLogout')
          next('/login')
        }
      }
    }
  } else {
    // 未登录:不能去交易相关、也不能去支付相关【pay|paysuccess】、不能去个人中心
    // 未登录去以上路由-----登录
    let toPath = to.path
    if (toPath.indexOf('/trade') != -1 || toPath.indexOf('/pay') != -1 || toPath.indexOf('/center') != -1 || toPath.indexOf('/shopcart') != -1) {
      // 把未登录的时候想去但是没有去的信息，存储于地址栏中【路由】
      next('/login?redirect=' + toPath)
    } else {
      // 去的不是上面这些路由（home|search|shopcart）--- 放行
      next()
    }
  }
})

export default router
